package condominio.dao;
// corregido TV [11AGO2011]

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import condominio.excepcion.DAOExcepcion;
import condominio.modelo.Garaje;
import condominio.util.ConexionBD;

public class GarajeDAO extends BaseDAO {

	public void insertarRegGaraje(Garaje objGaraje) throws DAOExcepcion {
		char chrAux;
		System.out.println("GarajeDAO: insertarRegGaraje(Garaje objGaraje)");
		String query = "INSERT INTO GARAJE (gar_id, gar_area, gar_tipo, gar_id_vivienda) VALUES (?, ?, ?, ?)";
		
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, objGaraje.getStrIDGaraje());
			stmt.setDouble(2, objGaraje.getNumArea());
			chrAux = objGaraje.getChrTipo();
			stmt.setString(3, Character.toString(chrAux)); // conversion de char a string
			stmt.setInt(4, objGaraje.getIntVivienda());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("Error. No se pudo insertar registro en table GARAJE");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Garaje obtenerGarajePorCodigo(String pCodGaraje) throws DAOExcepcion {
		String strAux;
		System.out.println("obtenerGarajePorCodigo(String pCodGaraje)" + pCodGaraje);
		Garaje objGaraje = new Garaje();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "SELECT gar_id, gar_area, gar_tipo, gar_id_vivienda FROM GARAJE WHERE gar_id = ?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, pCodGaraje);
			rs = stmt.executeQuery();
			if (rs.next()) {
				objGaraje.setStrIDGaraje(rs.getString(1));
				objGaraje.setNumArea(rs.getDouble(2));
				strAux = rs.getString(3);
				objGaraje.setChrTipo(strAux.charAt(0)); // lo enviamos como tipo "char"
				objGaraje.setIntVivienda(rs.getInt(4));
			}
		}
		catch (SQLException err) {
			System.err.println("No se encontro registro solicitado");
            err.printStackTrace();
		}
		finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return objGaraje;
	}

	public Collection<Garaje> buscarGarajePorVivienda(int pCodVivienda) throws DAOExcepcion {
		String strAux;
		System.out.println("GarajeDAO: buscarGarajePorVivienda(int pCodVivienda)");
		String query = "SELECT gar_id, gar_area, gar_tipo, gar_id_vivienda FROM GARAJE WHERE gar_id_vivienda = ?";
		Collection<Garaje> lista = new ArrayList<Garaje>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setInt(1, pCodVivienda);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Garaje objGaraje = new Garaje();
				objGaraje.setStrIDGaraje(rs.getString(1));
				objGaraje.setNumArea(rs.getDouble(2));
				strAux = rs.getString(3);
				objGaraje.setChrTipo(strAux.charAt(0)); // lo enviamos como tipo "char"
				objGaraje.setIntVivienda(rs.getInt(4));
				lista.add(objGaraje);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return lista;
	}

	public void eliminarRegGaraje(String pCodGaraje) throws DAOExcepcion {
		System.out.println("eliminarRegGaraje(String pCodGaraje)");
		String query = "DELETE FROM GARAJE WHERE gar_id=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, pCodGaraje);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar registro de GARAJE");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public void actualizarRegGaraje(Garaje pObjGaraje) throws DAOExcepcion {
		char chrAux;
		System.out.println("actualizarRegGaraje(Garaje pObjGaraje)");
		String query = "UPDATE GARAJE SET gar_area=?, gar_tipo=?, gar_id_vivienda=? WHERE gar_id=?";
		
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setDouble(2, pObjGaraje.getNumArea());
			chrAux = pObjGaraje.getChrTipo();
			stmt.setString(3, Character.toString(chrAux)); // conversion de char a string
			stmt.setInt(4, pObjGaraje.getIntVivienda());
			stmt.setString(1, pObjGaraje.getStrIDGaraje());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar registro GARAJE, ID " + pObjGaraje.getStrIDGaraje());
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Collection<Garaje> listarGarajes() throws DAOExcepcion {
		String strAux;
		System.out.println("listarGarajes()");
		Collection<Garaje> c = new ArrayList<Garaje>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
//			String query = "SELECT gar_id, gar_area, gar_tipo, gar_id_vivienda FROM GARAJE ORDER BY gar_tipo";
			String query = "SELECT gar_id, gar_area, gar_tipo, gar_id_vivienda, viv_id_propietario, pers_nombres, pers_apellidos " +
			"FROM GARAJE, VIVIENDA, PERSONA " +
			"WHERE GARAJE.gar_id_vivienda = VIVIENDA.viv_id AND VIVIENDA.viv_id_propietario = PERSONA.pers_id " +
			"ORDER BY gar_tipo, PERSONA.pers_id";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Garaje objGaraje = new Garaje();
				objGaraje.setStrIDGaraje(rs.getString("gar_id"));
				objGaraje.setNumArea(rs.getDouble("gar_area"));
				strAux = rs.getString("gar_tipo");
				objGaraje.setChrTipo(strAux.charAt(0)); // lo enviamos como tipo "char"
				objGaraje.setIntVivienda(rs.getInt("gar_id_vivienda"));
				objGaraje.setIntPropietario(rs.getInt("viv_id_propietario"));
				String strNombreProp = rs.getString("pers_apellidos") + ", " + rs.getString("pers_nombres"); 
				objGaraje.setStrNombrePropietario(strNombreProp);
				if (strAux.equals("P")) objGaraje.setStrTipoGarajeDesc("PROPIO");
				if (strAux.equals("A")) objGaraje.setStrTipoGarajeDesc("ALQUILADO");
				if (strAux.equals("E")) objGaraje.setStrTipoGarajeDesc("EXTERNO");
				c.add(objGaraje);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return c;
	}

}
